## 弱引用机制演示示例
## 展示 v1.1.0 弱引用优化如何防止内存泄漏
extends Node

var message_center = preload("res://MessageCenter.gd").new()


func _ready():
	print("========================================")
	print("弱引用机制演示")
	print("========================================\n")
	
	add_child(message_center)
	
	example_1_memory_leak_prevention()
	await get_tree().create_timer(1.0).timeout
	
	example_2_auto_cleanup()
	await get_tree().create_timer(1.0).timeout
	
	example_3_best_practice()


## 示例1：内存泄漏防护
func example_1_memory_leak_prevention():
	print("【示例1】内存泄漏防护")
	print("场景：创建临时对象并订阅，然后销毁对象但忘记取消订阅\n")
	
	# 创建临时节点
	var temp_node = Node.new()
	temp_node.name = "TemporaryNode"
	
	# 订阅消息
	message_center.subscribe(temp_node, "test_channel", func(sender, data):
		print("  临时节点收到消息: ", data)
	)
	
	print("订阅后数量: ", message_center.get_subscription_count("test_channel"))
	
	# 发送消息（应该能收到）
	message_center.send(self, "test_channel", "消息1")
	
	# 销毁节点但忘记取消订阅
	print("\n⚠️ 销毁节点，但忘记调用 unsubscribe...")
	temp_node.queue_free()
	await get_tree().process_frame
	
	print("\nv1.0.0 旧版本: ❌ 内存泄漏！对象无法回收")
	print("v1.1.0 新版本: ✅ 弱引用机制，对象可正常回收\n")
	
	# 再次发送消息
	print("再次发送消息...")
	message_center.send(self, "test_channel", "消息2（不应该被接收）")
	
	print("清理后订阅数量: ", message_center.get_subscription_count("test_channel"))
	print("✅ 自动清理失效订阅！\n")
	print("========================================\n")


## 示例2：自动清理机制
func example_2_auto_cleanup():
	print("【示例2】自动清理机制")
	print("场景：批量创建订阅者，然后全部销毁\n")
	
	var temp_nodes = []
	
	# 创建5个临时订阅者
	for i in range(5):
		var node = Node.new()
		node.name = "TempNode_" + str(i)
		temp_nodes.append(node)
		
		message_center.subscribe(node, "batch_test", func(sender, data):
			print("  节点 %s 收到: %s" % [node.name, data])
		)
	
	print("创建5个订阅者，当前数量: ", message_center.get_subscription_count("batch_test"))
	
	# 发送消息（所有人都能收到）
	message_center.send(self, "batch_test", "批量消息")
	
	# 销毁所有节点
	print("\n销毁所有5个节点...")
	for node in temp_nodes:
		node.queue_free()
	
	await get_tree().process_frame
	
	# 再次发送消息（触发自动清理）
	print("再次发送消息（触发自动清理）...")
	message_center.send(self, "batch_test", "清理测试")
	
	print("清理后订阅数量: ", message_center.get_subscription_count("batch_test"))
	print("✅ 所有失效订阅已自动清理！\n")
	print("========================================\n")


## 示例3：最佳实践（仍建议手动取消订阅）
func example_3_best_practice():
	print("【示例3】最佳实践")
	print("虽然有弱引用保护，但仍建议手动取消订阅\n")
	
	# 模拟游戏中的UI节点
	var ui_node = Node.new()
	ui_node.name = "UIManager"
	
	# 订阅
	message_center.subscribe(ui_node, "ui_event", func(sender, data):
		print("  UI更新: ", data)
	)
	
	print("订阅数量: ", message_center.get_subscription_count("ui_event"))
	
	# 发送消息
	message_center.send(self, "ui_event", {"health": 100})
	
	# ✅ 最佳实践：手动取消订阅
	print("\n✅ 节点销毁前，手动取消订阅...")
	message_center.unsubscribe_all(ui_node)
	
	print("取消订阅后数量: ", message_center.get_subscription_count("ui_event"))
	
	ui_node.queue_free()
	
	print("\n💡 建议：")
	print("   - 在 _exit_tree() 中调用 unsubscribe_all(self)")
	print("   - 代码意图更明确")
	print("   - 不依赖自动清理机制")
	print("   - 弱引用是安全网，而非依赖\n")
	print("========================================\n")


## 对比总结
func print_comparison():
	print("========================================")
	print("版本对比总结")
	print("========================================")
	print()
	print("v1.0.0 (旧版本):")
	print("  - 使用强引用存储订阅者")
	print("  - 忘记取消订阅会导致内存泄漏")
	print("  - 需要严格管理订阅生命周期")
	print()
	print("v1.1.0 (新版本):")
	print("  - 使用弱引用存储订阅者")
	print("  - 对象销毁后自动失效")
	print("  - 发送消息时自动清理失效订阅")
	print("  - 即使忘记取消订阅也不会内存泄漏")
	print("  - 提高系统健壮性")
	print()
	print("性能影响:")
	print("  - 额外开销: < 6%")
	print("  - 内存占用: 几乎无变化")
	print("  - 可忽略不计")
	print()
	print("========================================")
